package java流相关;

import java.io.*;

/**
 * @author coderFu
 * @create 2022/3/4
 *
 * 对象流 ， 对象的序列化与反序列化
 */
public class ObjectStream {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        /**
         *  对象流， 提供了一种序列化 和反序列化的实现方式
         *  序列化：指把堆内存中的ｊａｖａ对象数据，通过某种方式
         *  把对象存储到磁盘文件中，或者传递给其他网络的节点（在网络上
         *  传输），我们称这个为序列化
         *  反序列化： 把磁盘文件中的对象数据或者把网络节点中的数据恢复成
         *  java对象的过程
         *
         *  为什么要序列化：
         *  在分布式系统中，需要共享的数据的JavaBean对象，都得做序列化，
         *  此时需要把对象在网络上传输，此时就得把对象数据转换为二进制形式
         *  以后存储在HttpSession中的对象，都应该实现序列化接口（只有
         *  实现序列化接口的类，才能做序列化操作）
         *
         *  服务钝化： 如果服务发现某些对象好久都没有活动了，此时服务器就会
         *  把这些内存中的对象，持久化在本地磁盘文件中（Java对象->二进制文件）
         *  如果某些对象需要活动的时候，在去内存中去寻找，找到就使用，找不到就去
         *  磁盘文件中恢复
         *
         * 序列化方式： protobuf  jdk json2 String等
         *
         *
         */
        File file = new File("object.txt");

        writeObject(file);
        readObject(file);




    }


    public static void writeObject(File file) throws IOException {

        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
        objectOutputStream.writeObject(new Person("coderFu",23));
        objectOutputStream.close();
    }

    public static void readObject(File file) throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
        Person o = (Person)objectInputStream.readObject();
        System.out.println(o);
        objectInputStream.close();
    }
}

class Person implements Serializable{
    // 序列化的版本信息

    private static final long serialVersionUID = 8000614840830407684L;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    private String name;

    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
